home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 44 / Amiga Format CD44 (1999-08-26)(Future Publishing)(GB)(Track 1 of 3)[!][issue 1999-10].iso / -in_the_mag- / basics / amos / othello.lha / Othello.AMOS / Othello.amosSourceCode
AMOS Source Code  |  1994-08-11  |  6KB  |  247 lines

  1. ' *****************************
  2. ' * Othello by Dominic Ludlam *
  3. ' *   Converted from the 64   *
  4. ' *      in October 1993      *
  5. ' *  Modified in October '94  *  
  6. ' *****************************
  7.  
  8. Dim B(8,8),C(8),D(8,2),X(60),Y(60),N(60)
  9. Global B(),C(),D(),X(),Y(),N(),CP,PS,CS,EN
  10. OTHELLO
  11. '
  12. Procedure OTHELLO
  13.  
  14.    STRT:
  15.    Screen Open 1,320,256,32,Lowres
  16.    Curs Off : Cls 0 : Paper 0
  17.    Centre "Othello"
  18.    Draw 128,8 To 182,8
  19.    Colour 5,$80
  20.    Colour 6,$80
  21.    Reserve Zone 64
  22.    SETUPZONES
  23.    
  24.    _ASK:
  25.    Locate 0,13
  26.    Centre "Do you want first go (Y or N)" : Input X$
  27.    X$=Left$(X$,1) : CP=1 : If X$="n" Then CP=2
  28.    If(X$<>"y") and(X$<>"n") Then Goto _ASK
  29.    Curs Off 
  30.    
  31.    B(4,4)=1 : B(4,5)=2 : B(5,4)=2 : B(5,5)=1
  32.    For F=1 To 8 : Read A : D(F,1)=A : Read A : D(F,2)=A : Next 
  33.    Data -1,-1,0,-1,1,-1,-1,0,1,0,-1,1,0,1,1,1
  34.    _DRAWTHEBOARD
  35.    
  36.    MAIN_LOOP:
  37.    _UPDATETHEBOARD
  38.    If CS+PS=64 Then Gosub GAME_OVER
  39.    EG=0 : If CP=1 Then _PLAYERSMOVE : _UPDATETHEBOARD : If EG=1 Then Gosub GAME_OVER
  40.    If CS+PS=64 Then Gosub GAME_OVER
  41.    If CP=2 Then _COMPUTERSMOVE
  42.    Goto MAIN_LOOP
  43.    
  44.    GAME_OVER:
  45.    Locate 0,29
  46.    If CS>PS Then Print "That was Easy!!!"
  47.    If CS=PS Then Print "We drew, I need some practice!"
  48.    If CS<PS Then Print "You were lucky!"
  49.    _ASK4:
  50.    Locate 0,30 : Print "Do you want another game? (Y/N)"; : Input X$
  51.    X$=Upper$(X$)
  52.    If X$="Y"
  53.       For X=1 To 8
  54.          For Y=1 To 8
  55.             B(X,Y)=0
  56.          Next 
  57.       Next 
  58.       Goto STRT
  59.    End If 
  60.    If(X$<>"Y") and(X$<>"N") Then Goto _ASK4
  61.    End 
  62.  
  63. End Proc
  64. Procedure _UPDATETHEBOARD
  65.  
  66.    CS=0
  67.    PS=0
  68.    For F=1 To 8
  69.       For G=1 To 8
  70.          X=((F-1)*26)+12
  71.          Y=((G-1)*26)+12
  72.          If(B(F,G)=1) and Point(X,Y)<>2 Then Ink 2 : Paint X,Y,1
  73.          If(B(F,G)=2) and Point(X,Y)<>1 Then Ink 0 : Paint X,Y,1
  74.          If B(F,G)=1 Then PS=PS+1
  75.          If B(F,G)=2 Then CS=CS+1
  76.       Next G
  77.    Next F
  78.    Locate 27,1 : Print "1" : Locate 27,4 : Print "2" : Locate 27,8 : Print "3"
  79.    Locate 27,11 : Print "4" : Locate 27,14 : Print "5" : Locate 27,18 : Print "6"
  80.    Locate 27,21 : Print "7" : Locate 27,24 : Print "8"
  81.    Locate 0,27 : Print " 1  2   3  4  5  6   7  8"
  82.    Locate 33,1 : Print "Othello"
  83.    Locate 34,3 : Print "Player"
  84.    Locate 34,4 : Print "   " : Locate 34,4 : Print PS
  85.    Locate 32,6 : Print "Computer"
  86.    Locate 34,7 : Print "   " : Locate 34,7 : Print CS
  87.  
  88. End Proc
  89. Procedure _DRAWTHEBOARD
  90.  
  91.    Cls 0
  92.    Ink 5
  93.    Bar 0,0 To 208,208
  94.    Ink 2
  95.    For X=0 To 208 Step 26
  96.       Draw X,0 To X,208
  97.    Next X
  98.    For Y=0 To 208 Step 26
  99.       Draw 0,Y To 208,Y
  100.    Next 
  101.    Ink 6
  102.    For Z=13 To 208 Step 26
  103.       For Y=13 To 208 Step 26
  104.          Circle Z,Y,10
  105.       Next 
  106.    Next 
  107.  
  108. End Proc
  109. Procedure _PLAYERSMOVE
  110.  
  111.    _ASK2:
  112.    Repeat 
  113.       If Mouse Click=2 Then CP=2 : Pop Proc
  114.       If Mouse Click=3 Then EG=1 : Pop Proc
  115.    Until Mouse Zone>0 and Mouse Click=1
  116.    X=(Mouse Zone/8)+1
  117.    Y=(Mouse Zone mod 8)
  118.    If Y=0 Then Y=8
  119.    If Y=8 Then X=Mouse Zone/8
  120.    If(X<1 or X>8) or(Y<1 or Y>8) Then Goto _ASK2
  121.    If B(X,Y)>0 Then Goto BAD_MOVE
  122.    NF=0
  123.  
  124.    For F=1 To 8
  125.       CF=0
  126.       If X+D(F,1)=9 or X+D(F,1)=0 Then Goto SKIPPED
  127.       If Y+D(F,2)=9 or Y+D(F,2)=0 Then Goto SKIPPED
  128.       If X+D(F,1)=9 or X+D(F,1)=0 Then Goto SKIPPED
  129.       If B((X+D(F,1)),(Y+D(F,2)))=2 Then CF=1 : NF=1
  130.       SKIPPED:
  131.       C(F)=0 : If CF=1 Then C(F)=F
  132.    Next F
  133.    If NF<>1 Then Goto BAD_MOVE
  134.    RF=0
  135.  
  136.    For Q=1 To 8
  137.       If C(Q)=0 Then Goto SKIPPED2
  138.       XP=X : YP=Y
  139.       O:
  140.       Add XP,D(Q,1)
  141.       Add YP,D(Q,2)
  142.       If(XP=0 or XP=9) or(YP=0 or YP=9) Then C(Q)=0 : Goto SKIPPED2
  143.       If B(XP,YP)=2 Then Goto O
  144.       If B(XP,YP)=1 Then RF=1 : Goto SKIPPED2
  145.       If B(XP,YP)=0 Then C(Q)=0
  146.       SKIPPED2:
  147.    Next 
  148.  
  149.    If RF<>1 Then Goto BAD_MOVE
  150.    For Q=1 To 8
  151.       If C(Q)=0 Then Goto _NEXT
  152.       XP=X+D(Q,1) : YP=Y+D(Q,2)
  153.       TEST:
  154.       If B(XP,YP)=1 Then Goto _NEXT
  155.       B(XP,YP)=1
  156.       XP=XP+D(Q,1)
  157.       YP=YP+D(Q,2)
  158.       Goto TEST
  159.       _NEXT:
  160.    Next Q
  161.    B(X,Y)=1
  162.    CP=2 : Pop Proc
  163.  
  164.    BAD_MOVE:
  165.    If B(X,Y)>0 Then Locate 0,29 : Cline : Print "You cannot move onto an occupied square" : Wait 100 : Goto _ASK2
  166.    If NF<>1 Then Locate 0,29 : Cline : Print "Your move isn't next to one of my pieces" : Wait 100 : Goto _ASK2
  167.    If RF<>1 Then Locate 0,29 : Cline : Print "Your move doesn't flank a row" : Wait 100 : Goto _ASK2
  168.    Goto _ASK2
  169.  
  170. End Proc
  171. Procedure _COMPUTERSMOVE
  172.  
  173.    Locate 0,29 : Print "Thinking..."
  174.    NF=1
  175.    MX=0
  176.    For X=1 To 8
  177.       For Y=1 To 8
  178.          If B(X,Y)<>0 Then Goto _NEXT2
  179.          For F=1 To 8
  180.             XP=X
  181.             YP=Y
  182.             DX=D(F,1)
  183.             DY=D(F,2)
  184.             RF=0
  185.             P:
  186.             XP=XP+DY : YP=YP+DX : If(XP=0 or XP=9) or(YP=0 or YP=9) Then Goto _NEXT3
  187.             If B(XP,YP)=1 Then RF=1 : Goto P
  188.             If B(XP,YP)=2 and RF=1 Then N(NF)=F : X(NF)=X : Y(NF)=Y : NF=NF+1 : F=9
  189.             _NEXT3:
  190.          Next F
  191.          _NEXT2:
  192.       Next Y
  193.    Next X
  194.    NF=NF-1
  195.    If NF=0 Then Goto NO_MOVE
  196.  
  197.    For F=1 To NF
  198.       X=X(F)
  199.       Y=Y(F)
  200.       DX=D(N(F),1)
  201.       DY=D(N(F),2)
  202.       CF=0
  203.       _LOOP:
  204.       X=X+DY : Y=Y+DX : If B(X,Y)=1 Then CF=CF+1 : Goto _LOOP
  205.       If CF>MX Then MX=CF : MF=F
  206.    Next 
  207.  
  208.    For F=1 To 8
  209.       X=X(MF)
  210.       Y=Y(MF)
  211.       DX=D(F,1)
  212.       DY=D(F,2)
  213.       _LOOP2:
  214.       X=X+DY : Y=Y+DX
  215.       If(X=0 or X=9) or(Y=0 or Y=9) Then Goto _NEXT4
  216.       If B(X,Y)=1 Then Goto _LOOP2
  217.       If B(X,Y)=2 Then Goto SKIPPED3
  218.       If B(X,Y)=0 Then Goto _NEXT4
  219.       SKIPPED3:
  220.       X=X(MF)
  221.       Y=Y(MF)
  222.       _LOOP3:
  223.       B(X,Y)=2
  224.       X=X+DY
  225.       Y=Y+DX
  226.       If B(X,Y)=2 Then Goto _NEXT4
  227.       Goto _LOOP3
  228.       _NEXT4:
  229.    Next 
  230.    Locate 0,29 : Cline 
  231.    CP=1 : Pop Proc
  232.  
  233.    NO_MOVE:
  234.    Locate 0,29 : Print "I can't make a move" : Wait 100 : CP=1 : Pop Proc
  235.  
  236. End Proc
  237. Procedure SETUPZONES
  238.  
  239.    Z=1
  240.    For X=1 To 208 Step 26
  241.       For Y=1 To 208 Step 26
  242.          Set Zone Z,X,Y To X+25,Y+25
  243.          Inc Z
  244.       Next Y
  245.    Next X
  246.  
  247. End Proc